﻿using System.Collections.Generic;
using CTS.Com.Domain.Helper;
using CTS.Com.Domain.Model;
using CTS.Data.APLocales.Domain.Dao;
using CTS.Data.Domain.Constants;
using CTS.Data.Domain.Entity;

namespace CTS.Data.APLocales.Domain.Utils
{
    /// <summary>
    /// LocaleCom
    /// </summary>
    public class LocaleCom
    {
        private readonly LocaleComDao _comDao;
        public LocaleCom() { _comDao = new LocaleComDao(); }

        /// <summary>
        /// Kiểm tra tồn tại locale
        /// </summary>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>True/False</returns>
        public bool IsExist(string appCd, string localeCd, bool ignoreDeleteFlag)
        {
            // Trả về true trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(appCd)
                || DataCheckHelper.IsNull(localeCd)) {
                return true;
            }
            // Kết quả trả về
            return _comDao.IsExist(appCd, localeCd, ignoreDeleteFlag); ;
        }

        /// <summary>
        /// Lấy thông tin locale
        /// </summary>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Thông tin locale</returns>
        public LocaleInfo GetInfo(string appCd, string localeCd, bool ignoreDeleteFlag)
        {
            // Trả về null trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(appCd)
                || DataCheckHelper.IsNull(localeCd)) {
                return null;
            }
            // Lấy thông tin
            var dataInfo = _comDao.GetInfo(appCd, localeCd, ignoreDeleteFlag);
            // Kết quả trả về
            return DataHelper.CopyObject<LocaleInfo>(dataInfo);
        }

        /// <summary>
        /// Lấy danh sách locale
        /// </summary>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách locale</returns>        
        public IList<LocaleInfo> GetList(bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<LocaleInfo>();
            // Lấy danh sách locale
            var listInfo = _comDao.GetList(ignoreDeleteFlag);
            // Diệt danh sách locale
            foreach (var info in listInfo) {
                listResult.Add(DataHelper.CopyObject<LocaleInfo>(info));
            }
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách code
        /// </summary>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="skipCode">Skip code</param>
        /// <param name="nullValue">Thêm vào giá trị blank</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách code</returns>
        public IList<KeyValueObject> GetDiv(string appCd, string skipCode, bool nullValue, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var skipCodes = new string[0];
            var listResult = new List<KeyValueObject>();
            // Lấy danh sách skip code trong trường hợp skip code khác null
            if (skipCode != null) {
                skipCodes = skipCode.Split(DataLogics.DELIMITER_SKIP_CODE);
            }
            // Tạo giá trị trắng trong trường hợp có thêm giá trị trắng
            if (nullValue) {
                listResult.Add(new KeyValueObject());
            }
            // Lấy danh sách code
            var listData = _comDao.GetDiv(appCd, skipCodes, ignoreDeleteFlag);
            // Thêm danh sách code vào danh sách kết quả
            listResult.AddRange(listData);
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy tên locale
        /// </summary>
        /// <param name="appCd">Mã ứng dụng</param>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Tên locale</returns>
        public string GetName(string appCd, string localeCd, bool ignoreDeleteFlag)
        {
            // Trả về blank trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(appCd)
                || DataCheckHelper.IsNull(localeCd)) {
                return string.Empty;
            }
            // Kết quả trả về
            return _comDao.GetName(appCd, localeCd, ignoreDeleteFlag);
        }
    }
}
